home *** CD-ROM | disk | FTP | other *** search
Text File | 1997-06-28 | 3.3 KB | 84 lines | [TEXT/CWIE] |
- // Range.h
-
- #ifndef Range_h
- #define Range_h
-
- #ifndef Assert_h
- #include "Assert.h"
- #endif
-
- template < class Value >
- class Range
- {
- typedef Range<Value> RangeType;
-
- private:
- Value start;
- Value end;
-
- public:
- Range( Value v ) : start( v ), end( v ) {}
- Range( Value s, Value e ) : start( s ), end( e ) { Assert( s <= e ); }
-
- const Value& Start() const { return start; }
- const Value& End() const { return end; }
-
- Value Length() const { return end - start; }
-
- void SetStart( Value v ) { Assert( v <= end ); start = v; }
- void SetEnd( Value v ) { Assert( start <= v ); end = v; }
-
- bool IsEmpty() const { return start >= end; }
-
- bool Contains( Value v ) const { return start <= v && v < end; }
- bool StrictlyContains( Value v ) const { return start < v && v < end; }
- bool WeaklyContains( Value v ) const { return start <= v && v <= end; }
- bool ReverseContains( Value v ) const { return start < v && v <= end; }
-
- RangeType Head( Value middle ) const { Assert( middle <= end ); return RangeType( start, middle ); }
- RangeType Tail( Value middle ) const { Assert( start <= middle ); return RangeType( middle, end ); }
- RangeType Middle( Value s, Value e ) const { Assert( start <= s ); Assert ( e <= end ); return RangeType( s,e ); }
-
- bool IsHeadOf( const RangeType& r ) const { return start == r.start && end <= r.end; }
- bool IsTailOf( const RangeType& r ) const { return start >= r.start && end == r.end; }
-
- void RemoveHead( Value v ) { Assert( start <= v ); Assert( v <= end ); start = v; }
- void RemoveTail( Value v ) { Assert( start <= v ); Assert( v <= end ); end = v; }
- void AddHead( Value v ) { Assert( v <= start ); start = v; }
- void AddTail( Value v ) { Assert( end <= v ); end = v; }
-
- void RemoveHead( const RangeType& r ) { Assert( start == r.start ); Assert( r.end <= end ); start = r.end; }
- void RemoveTail( const RangeType& r ) { Assert( start <= r.start ); Assert( r.end == end ); end = r.start; }
- void AddHead( const RangeType& r ) { Assert( start == r.end ); start = r.start; }
- void AddTail( const RangeType& r ) { Assert( end == r.start ); end = r.end; }
-
- // These operators order ranges by containment
- bool operator==( const RangeType& r ) const { return start == r.start && end == r.end; }
- bool operator!=( const RangeType& r ) const { return start != r.start || end != r.end; }
- bool operator>=( const RangeType& r ) const { return start <= r.start && end >= r.end; }
- bool operator<=( const RangeType& r ) const { return start >= r.start && end <= r.end; }
- bool operator<( const RangeType& r ) const { return *this <= r && *this != r; }
- bool operator>( const RangeType& r ) const { return *this >= r && *this != r; }
-
- void operator&=( const RangeType& r ); // intersection
- void operator|=( const RangeType& r ); // union
- RangeType operator&( const RangeType& r ) const;
- RangeType operator|( const RangeType& r ) const;
-
- void ExtendToContain( Value v );
- void ExtendToWeaklyContain( Value v );
- void ExtendToStrictlyContain( Value v );
- void ExtendToReverseContain( Value v );
- };
-
- typedef Range<int8> Range8;
- typedef Range<uint8> URange8;
-
- typedef Range<int16> Range16;
- typedef Range<uint16> URange16;
-
- typedef Range<int32> Range32;
- typedef Range<uint32> URange32;
-
- #endif
-